#include "common.hpp"

// typedef union {
//     int i;
//     float f;
// } FL;
// typedef union {
//     long int i;
//     double d;
// } DL;
class FloatFunction {
public:
    // static float getOrigin(const float &x);
    // static void computeAllULP(const float &start, const float &end);
    // static void computeAllRandomULP(const float &start, const float &end, const long int &number);
    // static double getDoubleOrigin(const float &x);
    static double computeFloatToDoubleAllULP(const float &start, const float &end);
    static void computeFloatToDoubleRandomULP(const float &start, const float &end, const long int &number);
};

class DoubleFunction {
public:
    // static double getOrigin(const double &x);
    static void computeAllULP(const double &start, const double &end);
    static void computeAllRandomULP(const double &start, const double &end, const long int &number);
    //第二种误差检测方法，操作double的尾数位，且增加显著误差判断分支决定起始操作的尾数位位数
    static void detectMethod2(const double &start, const double &end);
    static void detectMethod2_1(const double &start, const double &end);
    static void detectMethod2_2(const double &start, const double &end);
    //模拟退火算法
    static vector<double> simulated_annealing(const double &start, const double &end);
};

class HalfFunction {
public:
    // //计算half类型强制类型转换为double的计算值，返回double类型结果
    // static double getDoubleOrigin(const half &x);
    //穷举[start,end]区间内所有的half点，墙砖为double与mpfr比较误差，输出导致最大误差的x和ulp
    static float computeHalfToDoubleAllULP(const half &start, const half &end);
};
